<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // ES6: ECMA 2015 ，标准 js的版本
        // ECMA : 计算机协会 
        // ES6的更新 ；
        // 一.let 及 const 
        // 1.let ：出现是为了替代  var 声明变量；
        // var a = 10;
        // let b = 20;
        // console.log(a,b);
        // let 和 var的区别 ？
        // 1.let 不能被重复声明 ；
        // let a = 10;
        // let a = 20;
        // console.log(a);

        // var a = 10;
        // var a = 20;
        // console.log(a);
        // 2.let 声明的变量 会被放在暂时性死区里； 不会被挂载在window上；
        // var a = 10;
        // console.log(window.a);
        // let a = 10;
        // console.log(window.a);

        // 3.let 支持 块级作用域 var 不支持块级作用域；
        // 全局作用域  局部作用域（1.函数作用域 2.块级作用域）;
        // 声明块级作用域  { };
        // {
        //     // 块级作用域；
        //     let a = 10;
        //     var b = 20;
        //     console.log(a);
        // }
        // // console.log(a);
        // console.log(b);
        // {
        //     let a = 20;
        //     console.log(a);

        // }

        // 循环生成块级作用域；
        // for(let i=0;i<3;i++){

        // }

        // 4.let 没有 hositing（声明前置 ，预解析）; 
        // var a;
        // console.log(a);
        // a = 10;
        // console.log(a);
        // let a = 10;


        // const 声明常量 ： 常量 一旦声明之后就不能被重新赋值
        // const NAME = "张三";
        // const NAME = "李四";
        // NAME = "李四";
        // const PI = "3.1415926";
        // const hello = "你好";
        // console.log(PI,hello);
        // 1.没有申明前置 2.不会挂载window上，临时性死区 3.支持块级作用域  4.不能被重复声明，且不能被重新赋值；

        // const 声明对象；
        // const obj = {
        //     name:"张三",
        //     age:20
        // }
        // // obj = {
        // //     name:"李四",
        // //     age:21
        // // }
        // obj.name = "李四";
        // console.log(obj);


        // 想要不可变的对象；Object.freeze()来冻结对象
        // Object.freeze: 只能冻结最外层对象 ，不能深层次冻结对象；
        const obj = {
            name:"张三",
            age:20,
            obj2:{
                height:"178cm"
            }
        }

    //   Object.freeze(obj);
    deepFreeze(obj)
    // console.log(newObj)
    obj.name = "李四";
    // obj.age = 22;
    obj.obj2.height = "180cm";

    console.log(obj)


    // 冻结深层次的对象  
    function deepFreeze(obj){
        Object.freeze(obj);
        for(let key in obj){
            if(typeof obj[key]==="object"){
                deepFreeze(obj[key]);
            }
        }
    }




    </script>
</body>
</html>